home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / byt86sep.arc / EXPS.ST1 < prev    next >
Text File  |  1980-01-01  |  17KB  |  467 lines

  1.  
  2.  
  3.                  **********  Example 1 **********
  4.  
  5. /* format.c */
  6. /* Format a floppy disk on the ST. Return 0 if sucess, else non-zero.
  7. Edit History:
  8. 000 19-Sep-85 MR Creation
  9. 001 07-Feb-86 MR Modified for BYTE article
  10. */
  11. /* #define DEBUG 1 */
  12. #include <osbind.h>                /* C bindings for OS routines */
  13.  
  14. #define HITRACK 79            /* Highest numbered track */
  15. #define SECTORS 9            /* Sectors per track */
  16. #define MAGIC 0x87654321L        /* Required by Flopfmt() */
  17. #define VIRGIN 0xE5E5            /* Pattern to write to sectors */
  18. #define ILEAVE 1            /* Interleave factor */
  19. #define DISKTYPE 2            /* Single side, 80 track */
  20. #define NOLOAD 0            /* No loader code in boot sector */
  21. #define RANDOM 0x1000000L        /* make protobt make a random */
  22. #define BOOTSECT 1            /* Side 0, sect 1 gets boot sect */
  23. #define TRACK0 0            /* Track for boot sector */
  24. #define SIDE0 0            /* Format side 0 */
  25.  
  26.  
  27. extern void errprint();            /* error notification routine */
  28.  
  29. format(devno)
  30. int devno;                /* device holding media to format */
  31. {
  32.     /* Automatic variables */
  33.     /* count tracks */
  34.     register int i;
  35.     /* buffer for track, protoboot */
  36.     register char *buf;
  37.     /* success in format? */
  38.     register int succ, totsucc = 0;
  39.     /* doesn't do anything */
  40.     long filler;
  41.  
  42.     /* Code */
  43.     /* Allocate memory for track.  The ST formats one track at
  44.     a time, and requires sufficient RAM to verify that track in
  45.     memory. Malloc is a GEMDOS call. */
  46.     buf = Malloc(8192L);
  47.     if (buf == 0L)
  48.     {
  49. #ifdef DEBUG
  50.         errprint(0, "insuff memory for format");
  51. #endif
  52.         return(-1);
  53.     }
  54.     
  55.     /* Format each track.  VIRGIN is the value to write to the newly
  56.     formatted track.  This particular value (0xE5E5) is suggested in the
  57.     documentation, but many values are possible. Flopfmt is XBIOS. */
  58.     for (i=HITRACK; i>=0; i--)
  59.     {
  60.         succ = Flopfmt(buf, filler, devno, SECTORS,
  61.                        i, SIDE0, ILEAVE, MAGIC, VIRGIN);
  62.         totsucc += succ;
  63.     }
  64.  
  65.     /* Release memory.  GEMDOS */
  66.     Mfree(buf);
  67.      
  68.     /* For the purposes of this routine, I won't accept any bad sectors.
  69.     But, if there were any, their numbers would have been left in the
  70.     buffer, buf, after each track was formatted.  I could alternatively 
  71.     retried, or recorded the bad sectors if I were developing my 
  72.     own file system. */
  73.  
  74.     if (totsucc != 0)
  75.     {
  76. #ifdef DEBUG
  77.         errprint(totsucc, "format failed");
  78. #endif
  79.         return(-1);
  80.     }
  81.  
  82.     /* Now we need to put a boot sector on the disk. */
  83.     /* Allocate a 512 byte buffer */
  84.     buf = Malloc(512L);
  85.     /* Prototype a boot sector in that buffer.  The second parameter
  86.     is a serial number for the disk.  The value I have chosen asks
  87.     the XBIOS to generate a random number. XBIOS */
  88.     Protobt(buf,RANDOM,DISKTYPE,NOLOAD);
  89.     /* Write out the boot buffer to track 0, side 0.  Last parameter
  90.     is how many sectors to write. */
  91.     succ = Flopwr(buf,filler,SIDENO,BOOTSECT,TRACK0,SIDE0,1);
  92.     /* Throw away memory */
  93.     Mfree(buf);
  94.     
  95.     /* Return success or failure */
  96.     return (succ);
  97. }
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.                   *********  Example 2 ********
  106.  
  107. This is a trap handler of the sort you might use if you were programming the ST in 68000 assembler, or you were using a high level language and needed to write a binding for access to a BIOS, XBIOS or GEMDOS function.  The functions assume the C calling conventions, that is, if there are any parameters, they are assumed to have been pushed onto the stack in reverse order, and to be no smaller than a word (16 bits).  The number of the routine itself must be pushed last, just before the trap call.  Of course if you are developing using the C provided in Atari's kit for developers, this process will be transparent to you, since a set of bindings is available which makes TOS calls look just like ordinary C function calls.
  108.  
  109. ; At entry, any arguments for the function have been pushed on the stack
  110. ; in reverse order, C-style.  Then the function number was pushed. 
  111. ; Finally this routine was called, so as we enter the return address of
  112. ; the caller is on top of the stack. 
  113.  
  114. retsv:  ds.l                ; some memory for a long variable
  115.  
  116. traprtn:
  117.     move.l (a7)+, retsv        ; Save off the return address,
  118.                     ; because the OS functions don't
  119.                     ; expect it.
  120.     trap     #13            ; Trap to the BIOS function. (BIOS
  121.                     ; is available through trap 13,
  122.                     ; XBIOS through 14, GEMDOS through
  123.                     ; trap 1).
  124.     move.l retsv, -(a7)        ; Put the return address back on
  125.                     ; stack.
  126.     rts                ; Return to caller.
  127.  
  128.  
  129.  
  130.  
  131.  
  132.                  ********** Example 3 **********
  133.  
  134. /* SAMPLE.C    Original version provided by Atari as part of the developer's
  135. kit. Rearranged, cleaned up, defines added, many variable names changed,
  136. and all comments added by M.R.
  137. */
  138.  
  139. /* This program is a simple example of use of some VDI primitives and certain
  140. parts of the AES, in particular the window library and the event handler.
  141. It opens a window on the desktop and draws a filled ellipse in it.  It waits
  142. for the user to move the window or resize it, and then redraws the ellipse.
  143. If the user selects the window close box, the program closes the window
  144. and then terminates.
  145. */
  146.  
  147. /* Defines.  These are all just for readibility. */
  148. #define COLOR0 0
  149. #define COLOR1 1
  150. #define SCREEN 1
  151. #define SOLID 1
  152. #define PATTERN 2
  153. #define USER 4
  154. #define DOT 1
  155. #define SYSTEM 1
  156. #define RC 2
  157. #define ARROW 0
  158. #define WORKAREA 4
  159. #define WNAME 2
  160. #define WINDAREA 1
  161. #define CLIPON 1
  162. #define WM_REDRAW 20
  163. #define WM_CLOSED 22
  164. #define WM_SIZED 27
  165. #define WM_MOVED 28
  166. #define WF_CURRXYWH 5
  167.  
  168. /* Window type bits */
  169. #define NAME 0x0001
  170. #define CLOSE 0x0002
  171. #define MOVE 0x0008
  172. #define SIZE 0x0020
  173.  
  174.  
  175. /* These arrays are used by the VDI in its own code.  The developer is
  176. expected to allocate room for them somewhere in the application. */
  177.  
  178. int contrl[12], intin[256], ptsin[256], intout[256], ptsout[256];
  179.  
  180. main()
  181. {
  182.     /* Local variables */
  183.  
  184.     /* For the workstation */
  185.     int workin[10];        /* Input values for v_openvwk() */
  186.     int workout[56];    /* Ouput values for v_openvwk() */
  187.     int shandle;        /* Workstation (screen) handle */
  188.  
  189.  
  190.     /* Variables for our application's window */
  191.     int whandle;        /* Window handle */
  192.     int wind_type;        /* Holds window attribute bits */
  193.     int xwork;        /* X coordinate, upper left hand corner,
  194.                    work area of window */        
  195.     int ywork;        /* Y coordinate, upper left hand corner,
  196.                    work area of window */
  197.     int wwork;        /* Width, work area of window */
  198.     int hwork;        /* Height, work area of window */
  199.     int xbord;        /* X coordinate, upper left hand corner,
  200.                    border of window */
  201.     int ybord;        /* Y coordinate, upper left hand corner,
  202.                    border of window */
  203.     int wbord;        /* Width, border area of window */
  204.     int hbord;        /* Height, border area of window */
  205.     int xcen, ycen;        /* Coordinates of central point in window */
  206.  
  207.     /* These four variables are returned by graf_handle() (described
  208.     later).  They are not used further in this application. */
  209.  
  210.     int gr_wchar, gr_hchar;    /* Width and height of a character cell
  211.                    for font used in menus and dialogs */
  212.     int gr_wbox, gr_hbox;    /* Width and height of box large enough
  213.                    to hold a system font character */
  214.  
  215.     /* Miscellaneous */
  216.     int ap_id;        /* Application id */
  217.     int clip[4];        /* Holds coordinates defining clip region */
  218.     int mgbuf[8];        /* Buffer for message events from AES */
  219.     int dummy;        /* Word buffer for miscellaneous use */
  220.  
  221.     /* Begin program */
  222.  
  223.     /* Appl_init is the AES initialization routine.  It makes the AES
  224.     aware of the application, and initializes certain AES data
  225.     structures.  The application id it returns can be used later by 
  226.     the application for other AES routines. */
  227.  
  228.     ap_id = appl_init();
  229.  
  230.     /* When the application starts, GEM has already opened the screen
  231.     workstation for its own use.  Therefore the screen has a workstation
  232.     handle (identifier).  We need this handle to open our own virtual
  233.     workstation with the attributes we would like.  The routine
  234.     graf_handle (part of the AES graphics library) returns this handle.
  235.     It also puts certain character size info into the passed parameters
  236.     (which we don't happen to need). */
  237.  
  238.     shandle = graf_handle(&gr_wchar,&gr_hchar,&gr_wbox,&gr_hbox);
  239.  
  240.     /* Now we can open a virtual workstation.  If the
  241.     attributes of the GEM opened physical workstation were to our
  242.     liking, we could just use it.  Or we could change the attributes
  243.     with VDI attribute calls.  As often is the case, GEM provides
  244.     redundancy - a decision as to elegance is up to you.
  245.  
  246.     The workin array will define the default attributes we want. Note
  247.     these are all defaults.  We will modify some during the main loop
  248.     of the program. */
  249.  
  250.     /* The device type - 1 is for screen */
  251.     workin[0] = SCREEN;
  252.  
  253.     /* Set the line type to a solid line */
  254.     workin[1] = SOLID;
  255.  
  256.     /* Polyline color index to 1 (The background color defaults to
  257.     whatever is in color register 0.  The foreground to whatever is
  258.     in register 1.  So by selecting 1, we are selecting the default
  259.     foreground color.  Incidentally, on a monochrome system, 0
  260.     defaults to white, and 1 to black.  Thus the screen has that
  261.     black on white, Mac-like appearence). */
  262.     workin[2] = COLOR1;
  263.  
  264.     /* Marker type 1 - which happens to be a dot.  This is set for
  265.     completeness; there is no use of the polymarker routine in
  266.     this application. */
  267.     workin[3] = DOT;
  268.  
  269.     /* Polymarker color set to 1.  Ditto */
  270.     workin[4] = COLOR1;
  271.  
  272.     /* Text face to the system face */
  273.     workin[5] = SYSTEM;
  274.  
  275.     /* Text color */
  276.     workin[6] = COLOR1;
  277.  
  278.     /* Fill interior style.  The available styles for a fill are
  279.     hollow, solid, pattern, hatch, and user-defined.  Hollow fills
  280.     with the background color (index 0).  Solid with the currently
  281.     selected fill color.  The other three choices are further modified
  282.     by the fill style index (see the next entry in array) to pick
  283.     the fill pattern.
  284.     */
  285.     workin[7] = SOLID;
  286.  
  287.     /* Fill index style.  This modifies fill interior style to select
  288.     the actual fill style (unless the interior style is solid or hollow).
  289.     We'll just select the default 1. */
  290.     workin[8] = 1;
  291.  
  292.     /* Fill color. */
  293.     workin[9] = COLOR1;
  294.  
  295.     /* The last entry in the array selects either raster coordinates
  296.     (machine specific) or normalized device coordinates (portable). */
  297.     workin[10] = RC;
  298.  
  299.     /* Open our virtual workstation, passing it the input array,
  300.     the physical workstation handle, and the ouput array. Note, the
  301.     virtual workstation's handle is returned in the same variable
  302.     which held the physical handle.  A VDI routine. */
  303.  
  304.     v_opnvwk(workin, &shandle, workout);
  305.  
  306.     /* Set the mouse cursor form to the arrow.  Yes, this is the default
  307.     anyway, but this is supposed to be an example program, you know?
  308.     The second parameter in graf_mouse is a dummy in this case.  If
  309.     the mouse form selected was not pre-defined, the second parameter
  310.     would have to be a pointer to a mouse form definition block - a
  311.     data structure for defining a mouse-driven cursor. Graf_mouse is
  312.     an AES routine. */
  313.  
  314.     graf_mouse(ARROW,&dummy);
  315.  
  316.     /* Time to get into the meat of the problem.  We want to create
  317.     a window for our application.  The first thing to do is get the size
  318.     of the desktop window.  This is a window GEM creates when the system
  319.     boots.  Since it occupies the entire screen, it is a guide to the
  320.     maximum area our application can use.  The function wind_get can
  321.     be used to get various values; here we are going to get the size
  322.     of the work area (area not including border) of the desktop window
  323.     (the first parameter is 0, indicating the desktop window).  Since
  324.     we intend OUR window to use this entire area, we put the results
  325.     into the variables we will be using to define the border of our
  326.     window. This and all the functions beginning wind_ are AES functions. */
  327.  
  328.     wind_get(0,WORKAREA,&xbord,&ybord,&wbord,&hbord);
  329.  
  330.     /* Now we know the size for our window. To create it,
  331.     we need to specify its attributes, and its border size. */
  332.  
  333.     /* We want a window with a name, a close box, a move bar and a
  334.     size box... */
  335.  
  336.     wind_type = NAME | CLOSE | MOVE | SIZE;
  337.  
  338.     /* O.K.  Make me a window.  This call sets up internal data
  339.     structures and establishes the maximum size for the window,
  340.     but it does not actually draw the window on the screen. */
  341.  
  342.       whandle = wind_create(wind_type,xbord,ybord,wbord,hbord);
  343.  
  344.     /* We specified we wanted a window with a name, but now we need
  345.     to specify what that name is.  This function can also be used
  346.     to set or change other window parameters. */
  347.  
  348.     wind_set(whandle,WNAME,"SAMPLE",0,0);
  349.  
  350.     /* At last, draw the window.  We have decided to draw it initially
  351.     in its full size, but we could vary the last four parameters of this
  352.     function if we desired otherwise. */
  353.  
  354.     wind_open(whandle,xbord,ybord,wbord,hbord);
  355.  
  356.     /* Incidentally, we have never found out the size of the work area
  357.     of our window.  We'll need that later, so let's do it with the
  358.     wind_calc function.  This function, given the window type can
  359.     determine either the border or the work area dimensions. */
  360.   
  361.     wind_calc(WINDAREA,wind_type,xbord,ybord,wbord,hbord,
  362.               &xwork,&ywork,&wwork,&hwork);
  363.  
  364.  
  365.     /* Now, draw the filled ellipse in our window and wait for messages
  366.     from the AES.  If it's a window resize or move message, recalculate
  367.     the window work area, clear it, and redraw the ellipse. */
  368.  
  369.     do
  370.     {
  371.         /* If the user expands the size of the window, not only will
  372.         the AES send a resize message, it will also send a redraw
  373.         message, on the assumption that more of the window is
  374.         visible, and you might want to update it.  We are redrawing
  375.         the entire visible portion of the window work area on receipt 
  376.         of a resize message anyway, so we can ignore the redraw 
  377.         message.  */
  378.  
  379.         if (mgbuf[0] != WM_REDRAW) 
  380.         {
  381.             /* Hide the cursor.  Otherwise area under it will not 
  382.             be affected by VDI routines.  AES. */
  383.             v_hide_c(shandle);
  384.  
  385.             /* Set up the clipping rectangle to equal the work 
  386.             area of    the window.  Actually, we have no intention
  387.             of drawing outside these boundaries anyway, but as 
  388.             I said, this is a demo program, so here's how you 
  389.             specify clip.  All subsequent graphic primitives in 
  390.             the VDI will respect these boundaries, unless the 
  391.             routine is called again with a different clip
  392.             rectangle, or with the second parameter set to 0 
  393.             (which means turn clipping off altogether). VDI. */
  394.  
  395.             clip[0]=xwork;
  396.             clip[1]=ywork;
  397.             clip[2]=xwork+wwork-1;
  398.             clip[3]=ywork+hwork-1;
  399.             vs_clip(shandle,CLIPON,clip);
  400.  
  401.             /* Let's clear the window work area to background color.
  402.             There are lots of ways to do this.  Here we set the
  403.             interior fill style to pattern, the interior style index
  404.             to 8 (which selects a "solid" pattern), and the fill
  405.             color to 0, the background color.  Then we call a 
  406.             primitive - v_bar, which draws a filled bar of the 
  407.             size defined by    its second parameter (for which we 
  408.             used the already available clip rectangle).  All these 
  409.             routines are VDI.  */
  410.  
  411.             vsf_interior(shandle,PATTERN);
  412.             vsf_style(shandle,8);
  413.             vsf_color(shandle,COLOR0);
  414.             v_bar(shandle,clip);
  415.  
  416.             /* Set the fill interior and color
  417.             to the desired style.  Calculate the ellipse
  418.             center point.  And voila! - draw the ellipse.
  419.             These are all VDI routines. */
  420.  
  421.             vsf_interior(shandle,USER);
  422.             vsf_color(shandle,1);
  423.             xcen=xwork+wwork/2;
  424.             ycen=ywork+hwork/2;
  425.             v_ellipse(shandle,xcen,ycen,wwork/2,hwork/2);
  426.  
  427.                   /* Reshow the cursor, since we're done drawing. AES. */
  428.             v_show_c(shandle);
  429.         }
  430.         /* End of the part we don't do on a redraw message. */
  431.  
  432.         /* O.K. Go to sleep until we get a message that the user
  433.         has done something interesting.  AES. */
  434.         evnt_mesag(&mgbuf);
  435.  
  436.         /* If user wanted to resize window or move it, the
  437.         new border coordinates will have been left in the message
  438.         buffer,    positions 4 through 7.  Use them to recalculate
  439.         the work area size and reset the coordinates of the entire
  440.         window. */ 
  441.         if (mgbuf[0] == WM_SIZED || mgbuf[0] == WM_MOVED)
  442.         {
  443.             wind_calc(WINDAREA,wind_type,mgbuf[4],mgbuf[5],
  444.                   mgbuf[6],mgbuf[7],&xwork,&ywork,
  445.                   &wwork,&hwork);
  446.               wind_set(whandle,WF_CURRXYWH,mgbuf[4],mgbuf[5],
  447.                      mgbuf[6],mgbuf[7]);
  448.         }
  449.     }
  450.     /* Repeat until the message from the AES says the user clicked the
  451.     window close box. */
  452.     while (mgbuf[0] != WM_CLOSED);
  453.        
  454.     
  455.     /* Close and delete the window.  The data structure remains allocated 
  456.     until a window delete. */
  457.  
  458.     wind_close(whandle);
  459.     wind_delete(whandle);
  460.  
  461.     /* Close the virtual workstation. */
  462.     v_clsvwk(shandle);
  463.  
  464.     /* Tell the AES the application is done, and terminate */
  465.     appl_exit();
  466. }
  467.